// 8. 属性修饰符
/*
readonly 只读属性           属性⽆法修改
public  公开的             可以在类、⼦类和对象中修改
protected 受保护的          可以在类、⼦类中修改
private 私有的             可以在类中修改
*/
// 9. 泛型
// 定义⼀个函数或类时，有些情况下⽆法确定其中要使⽤的具体类型（返回值、参数、属性的类型不能确 定），
// 此时就需要泛型了
// 举例： <T> 就是泛型，（不⼀定⾮叫 T ），设置泛型后即可在函数中使⽤ T 来表示该类型：
function test(arg) {
    return arg;
}
// 不指名类型，TS会⾃动推断出来
console.log(test(20));
// 指名具体的类型
console.log(test('diao mao'));
console.log(test(90));
// 泛型可以写多个
function test2(arg1, arg2) {
    return arg2;
}
// 为多个泛型指定具体⾃值
var x = test2(96, 'hello');
console.log(x);
// 类中同样可以使⽤泛型：
var MyClass = /** @class */ (function () {
    function MyClass(prop) {
        this.prop = prop;
    }
    return MyClass;
}());
// 泛型T必须是MyInter的⼦类，即：必须拥有length属性
function test33(arg) {
    return arg.length;
}
// test33(10) // 类型“number”的参数不能赋给类型“Demo”的参数
// test33({name:'张三'}) // 类型“{ name: string; }”的参数不能赋给类型“Demo”的参数
console.log(test33('123'));
console.log(test33({ name: '张三', length: 10 }));
